package com.zmn.plat.persistence.interfaces.category;

import com.zmn.common.dto.StatusDTO;
import com.zmn.plat.model.entity.category.BaseCategory;
import com.zmn.plat.model.entity.category.BaseCategoryQuery;
import com.zmn.plat.model.entity.category.CategoryInfoDTO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author duanzuocai
 * @version v1.0
 * @类说明：
 * @since 2018/10/19 10:02
 */
public interface CategoryDao {

    /**
     * ID 查询
     *
     * @param categId 分类ID
     * @return
     */
    BaseCategory findByKey(int categId);

    /**
     * ID 查询
     *
     * @param ids
     * @return
     */
    List<BaseCategory> findByKeys(@Param("ids") List<Integer> ids);

    /**
     * 名称查询
     *
     * @param name 名称
     * @return
     */
    BaseCategory findByName(String name);

    /**
     * 通过前台二级分类id获取前台产品二级分类
     *
     * @param categId 后台二级分类id
     * @return
     */
    BaseCategory findShowCategoryByCategId(@Param("categId") Integer categId);

    /**
     * 搜索
     *
     * @param query 条件
     * @return
     */
    List<BaseCategory> listByQuery(BaseCategoryQuery query);

    /**
     * 描述: 查询所有产品
     *
     * @return java.util.List<com.zmn.plat.model.entity.category.BaseCategory>
     * @author jiafei
     * @since 2021/6/29 10:16
     */
    List<BaseCategory> listAll();

    /**
     * 分页搜索
     *
     * @param query 条件
     * @return
     */
    List<BaseCategory> listPageByQuery(BaseCategoryQuery query);

    /**
     * 分页搜索:计价器专用
     *
     * @param query 条件
     * @return
     */
    List<BaseCategory> listPageByFaultQuery(BaseCategoryQuery query);

    /**
     * 搜索统计
     *
     * @param query 条件
     * @return
     */
    Integer countByQuery(BaseCategoryQuery query);

    /**
     * 搜索统计:计价器专用
     *
     * @param query 条件
     * @return
     */
    Integer countByFaultQuery(BaseCategoryQuery query);

    /**
     * 根据渠道ID和服务分类ID查询前台一级产品分类
     *
     * @param channelId   the channel id
     * @param servCategId the serv categ id
     * @return
     */
    List<BaseCategory> listOneShowCategoryByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId);

    /**
     * 根据渠道ID和服务分类ID查询后台一级产品分类
     *
     * @param channelId   the channel id
     * @param servCategId the serv categ id
     * @return
     */
    List<BaseCategory> listOneCategoryByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId);

    /**
     * 根据渠道ID和后台产品一级分类ID查询后台二级产品分类
     *
     * @param channelId  the channel id
     * @param categOneId the categ one id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCategOneId(@Param("channelId") Integer channelId, @Param("categOneId") Integer categOneId);

    /**
     * 根据渠道ID和前台产品一级分类ID查询前台二级产品分类
     *
     * @param channelId  the channel id
     * @param categOneId the categ one id
     * @return
     */
    List<CategoryInfoDTO> listShowCategoryByChannelIdAndCategOneId(@Param("channelId") Integer channelId, @Param("categOneId") Integer categOneId);

    /**
     * 获取渠道开通的后台二级分类列表
     *
     * @param channelId   the channel id
     * @param servCategId the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId);

    /**
     * 获取渠道开通的前台二级分类列表
     *
     * @param channelId   the channel id
     * @param servCategId the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listShowCategoryByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("servCategId") Integer servCategId);

    /**
     * 获取渠道开通的前台一、二级分类列表
     *
     * @param channelId   the channel id
     * @return
     */
    List<CategoryInfoDTO> listShowCategByChannelId(@Param("channelId") Integer channelId);

    /**
     * 获取渠道城市开通的前台二级分类列表
     *
     * @param channelId   the channel id
     * @param cityId      the city id
     * @param servCategId the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCityIdAndServCategId(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId, @Param("servCategId") Integer servCategId);

    /**
     * 根据前台服务品类查询关联的后台服务品类
     * @param unionIds
     * @return
     */
    List<CategoryInfoDTO> listCategoryByShowCategoryUnionIds(String[] unionIds);

    /**
     * 获取渠道开通的二级分类列表(批量服务分类ID)
     *
     * @param channelId   the channel id
     * @param showType    产品分类 1后台 2前台
     * @param servCategIds the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndServCategIds(@Param("channelId") Integer channelId, @Param("showType") Integer showType, @Param("servCategIds") List<Integer> servCategIds);

    /**
     * 获取渠道城市开通的二级分类列表(批量服务分类ID)
     *
     * @param channelId   the channel id
     * @param cityId      the city id
     * @param servCategIds the serv categ id
     * @return
     */
    List<CategoryInfoDTO> listCategoryByChannelIdAndCityIdAndServCategIds(@Param("channelId") Integer channelId, @Param("cityId") Integer cityId, @Param("servCategIds") List<Integer> servCategIds);

    /**
     *
     * 获取前台产品对应的后台产品的二级分类
     *
     * @Param:productFaultItemQuery
     * @return: List<BaseCategory>
     * @Author: tanbiao
     * @since: 2019/11/21 17:28
     */
//    List<ProductTariffGroupItemVo> listCategoryByShowProductId(ProductTariffGroupItemQuery productFaultItemQuery);

    /**
     * 根据showType level查询当前最大排序号
     * @param showType
     * @param level
     * @return
     */
    Integer findMaxSort(@Param("showType") Integer showType, @Param("level") Integer level);

    /**
     * 更新
     *
     * @param categ 对象
     * @return
     */
    Integer updateByKey(BaseCategory categ);

    /**
     * 更新排序
     *
     * @param category 条件
     * @return
     */
    Integer updateSortKey(BaseCategory category);

    /**
     * 更新首字母
     *
     * @param category 条件
     * @return
     */
    Integer updateFirstLetterByKey(BaseCategory category);

    /**
     * 更新简称
     *
     * @param category 条件
     * @return
     */
    Integer updateSimpleSpellKey(BaseCategory category);
    /**
     * 批量更新状态
     *
     * @param dto 条件
     * @return
     */
    int updateStatusBatch(StatusDTO dto);
    /**
     * 批量更新计价器状态
     *
     * @param categoryIds 分类id
     * @param status 计价器状态
     * @param mcStaffName 更改人
     * @param productType 产品类型
     * @return
     */
    Integer updateTariffStatusBatch(@Param("categIds") List<Integer> categoryIds, @Param("status")int status, @Param("mcStaffName")String mcStaffName, @Param("productType")Integer productType);

    /**
     * 插入
     *
     * @param area 对象
     * @return
     */
    Integer insert(BaseCategory area);

    /**
     * 删除
     *
     * @param areaId id
     * @return
     */
    Integer deleteByKey(Integer areaId);

}
